package dao;

import dominio.Usuario;
import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 * 
 *
 * @author eagle
 */
public class UsuarioDao {

    private EntityManager em;

    /**
     * Metodo quue permite craer usuarios en el sistema.
     * @param nombreUsuario
     * @param clave
     * @param tipoUsuario
     * @return {@link Usuario}
     */
    public Usuario crearUsuario(String nombreUsuario, String clave, String tipoUsuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        Usuario usuario;
        try {

            this.em = emf.createEntityManager();
            usuario = new Usuario(nombreUsuario, clave, tipoUsuario);
            usuario.setNombreUsuario(nombreUsuario);
            usuario.setClave(clave);
            usuario.setClave(clave);
            em.getTransaction().begin();
            em.persist(usuario);
            em.getTransaction().commit();

        } catch (Exception e) {
            System.out.println("Error al crear el usuario" + e.getMessage());
            return null;
        } finally {
            em.close();
            emf.close();
        }

        return usuario;
    }

    public Usuario encontrarUsuario(String nombreUsuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        Usuario u = em.find(Usuario.class, nombreUsuario);// con esta funcion se buscas un dato por primary key, el primer parametro es nuestra clase entidad
        em.close();
        emf.close();
        return u;
    }

    public void borrarUsuario(String nombreUsuario) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Usuario u = em.find(Usuario.class, nombreUsuario);//en este caso podemos borrar un usuario por nombre
        if (u != null) {//si no lo encuentra por supuesto no lo intenta borrar
            em.remove(u);// borra de la tabla ese registro
        }
        em.getTransaction().commit();
        em.close();
        emf.close();
    }

    public Usuario actualizarUsuario(String nombreUsuario, String claveNueva) {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("SiaPersistencia");
        this.em = emf.createEntityManager();
        em.getTransaction().begin();
        Usuario u = em.find(Usuario.class, nombreUsuario); //se usa el entity manager para encontrarlo luego cuando se llame ActualizarUsuario se hace commit y va a persistir el usuario actualizado
        if (u != null) {
            u.setClave(claveNueva);//la funcionalidad de actualizar sirve para cambiar la clave por el momento
        }
        em.getTransaction().commit();
        em.close();
        emf.close();
        return u;
    }

    public Collection<Usuario> encontrarUsuarios() { //encontrar todos los usuarios
        Query query = em.createQuery("SELECT u FROM Usuario u");// Ojo la sentencia estÃ¡ en Java Query Language, no SQL
        return (Collection<Usuario>) query.getResultList(); // me guarda la lista de todos los usuarios en mi coleccion
    }

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }
}
